
#ifdef __cplusplus 
extern "C" 
{ 
#endif	

typedef void (*OnNetConnectedPtr)();
typedef void (*OnNetConnectionFailedPtr)(int errorCode);
typedef void (*OnUserLoginSucceedPtr)(const char*user);
typedef void (*OnUserLoginFailedPtr)(const char*user, int errorCode, const char* reason);
typedef void (*OnUserLogoutPtr)(const char*user);
typedef void (*OnRecvCallPtr)(int session, const char* from, const char* displayname, const char* to, int callType);
typedef void (*OnRecvAnswerPtr)(int session, const char* from, const char* displayname, const char* to, int callType);
typedef void (*OnRecvRingPtr)(int session, const char* from, const char* displayname, const char* to, int EarlyMedia);
typedef void (*OnRecvHangupPtr)(int session, int errorCode, const char* reason,int callType);
typedef void (*OnRecvReinvitePtr)(int session, const char* from, const char* displayname, const char* to, int callType);
typedef void (*OnNotifyVideoRtpPortPtr)(int port);
typedef void (*OnRecvDtmfPtr)(int Eventno);


typedef struct ObserverStr {

    OnNetConnectedPtr OnNetConnected_;
    OnNetConnectionFailedPtr OnNetConnectionFailed_;
    OnUserLoginSucceedPtr OnUserLoginSucceed_;
    OnUserLoginFailedPtr OnUserLoginFailed_;
    OnUserLogoutPtr OnUserLogout_;
    OnRecvCallPtr OnRecvCall_;
    OnRecvAnswerPtr OnRecvAnswer_;
    OnRecvRingPtr OnRecvRing_;
    OnRecvHangupPtr OnRecvHangup_;
    OnRecvReinvitePtr OnRecvReinvite_;
    OnNotifyVideoRtpPortPtr OnNotifyVideoRtpPort_;
    OnRecvDtmfPtr OnRecvDtmf_;

} SignalingObserverStr;




int CRegisterUserToServer(char* sSerAddr,
			 int iPort,
			 char* sUserName,
			 char* sPassWord);
/**
RegisterUserToOTTServer() 用户注册
@param sSerAddr     服务器IP地址
@param iPort        服务器端口
@param sUserName    用户名
@param sAppkey      AppKey
@param sToken       密码
@return 返回值，0-成功，其他-失败
**/
int CRegisterUserToOTTServer(char* sSerAddr,
			 int iPort,
			 char* sUserName,
			 char* sAppkey,
			 char* sToken);
int CRegisterUser2IMSServer(
				 char* serverlUrl,
	             char* serverAddr,
			     int iPort,
			     char* userName,
			     char* displayName,
			     char* authName,
			     char* password);

/**
DeregisterUserFromOTTServer() 从服务器注销当前OTT账户
@return 返回值，0-成功，其他-失败
**/
int CDeregisterUserFromOTTServer();
/**
DeregisterUserFromIMSServer() 从服务器注销当前IMS账户
@return 返回值，0-成功，其他-失败
**/
int CDeregisterUserFromIMSServer();

/**
RegisterTraceCallback() 注册TraceCallback
@param callback TraceCallback指针
@param logPath, 需要保存log信息时传入log文件地址，无需保存log信息时传入空字符串 "" 即可
@return 返回值，0-成功，其他-失败
**/
int CRegisterTraceCallback(char* logPath);
int CDeregisterTraceCallback();
int CRegisterSignalingObserver(SignalingObserverStr* Str);
int CDeregisterSignalingObserver();
int CRegisterAudioStatisticsObserver() ;
int CDeregisterAudioStatisticsObserver();
int CGetAvailableSessionSeq();
int CRegisterDtmfEventObserver();

/**
SetDeviceInfo() 传入设备信息
@param OSVersion, 操作系统版本
@param imageVersion, 固件版本
@param hardwareVersion, 硬件版本
@param deviceModel, 设备型号
@param SN, 设备SN
@param CMEI, 设备CMEI
@param MAC, 设备MAC地址
@return 无返回值
**/
void CSetDeviceInfo(char* OSVersion, char* imageVersion, char* hardwareVersion, char* deviceModel, char* SN, char* CMEI, char* MAC);

/**
GetIMSAccountNumber() 获取ims账号
@param appKey 输入参数，应用的key

@param deviceId 输入参数，设备ID
@param imsNumber 输出参数，返回固话号码
@return 返回值，0-成功，其他-失败
**/

int CGetIMSAccountNumber(char* appKey, char* appSecret, char* deviceId, char* imsNumber);



/**
CreateEngine() 创建引擎
@return 返回值，0-成功，其他-失败
**/
int CCreateEngine();

/**
DestroyEngine() 销毁引擎
@return 返回值，0-成功，其他-失败
**/
void CDestroyEngine();


/**
initSDK() 初始化用户信息
@param deviceId 设备id
@param appKey 设备appkey
@return 返回值，0-成功，其他-失败
**/
int CinitSDK(char* deviceId,char* appKey);

/**
Callout() 发起呼叫
@param session 会话id
@param strNumber 被叫号码
@param type 呼叫类型 0-1v1音频 1-1v1视频 20-1v1ims音频 21-1v1ims视频
@return 返回值，0-成功，其他-失败
**/
int CCallout(int session, char* strNumber, int type);
/**
CalloutById() 发起电话呼叫，当phoneNumber存在时以phoneNumber呼叫；否则以通信录ID发起呼叫
@param session 会话id
@param contactId 通信录ID
@param  phoneNumber 被叫号码
@param type 呼叫类型 0-1v1音频 1-1v1视频 20-1v1ims音频 21-1v1ims视频
@return 返回值，0-成功，其他-失败
**/
int CCalloutById(int session, char* contactId, char* phoneNumber, int callType);

/**
Pickup() 接听
@param session 会话id
@return 返回值，0-成功，其他-失败
**/
int CPickup(int session);
/**
Hangup() 挂断
@param session 会话id
@return 返回值，0-成功，其他-失败
**/
int CHangup(int session);
/**
SendDtmf() 发送DTMF
@param session  会话id
@param code     dtmf code
@return 返回值，0-成功，其他-失败
**/
int CSendDtmf(int session,int code);
/**
CProvideRecordedAudioData() send audio data from external
@param recordedData 
@return 返回值，0-成功，其他-失败
**/
int CProvideRecordedAudioData(const char* recordedData, unsigned int nSamples);
/**
CRequestPlayoutAudioData() send audio data from external
@param recordedData 
@return 返回值，0-成功，其他-失败
**/
int CRequestPlayoutAudioData(char* recordedData);
/**
CEnableStartDataDump() start to dump audio data
@param 
@return 返回值，0-成功，其他-失败
**/
int CEnableStartDataDump();
/**
CProvideRecordedAudioData() stop to dump audio data
@param 
@return 返回值，0-成功，其他-失败
**/
int CDisableStartDataDump();
/**
SetSpeakerVolume() 设置扬声器音量
@param session  会话id
@param level    扬声器音量
@return 返回值，0-成功，其他-失败
**/
int CSetSpeakerVolume(int session, int level);
/**
GetSpeakerVolume() 获取扬声器音量
@param session 会话id
@return 返回值，扬声器音量
**/
int CGetSpeakerVolume(int session);
/**
SetOutputMute() 设置输出为静音
@param session  会话id
@param enable   0-不静音，1-静音
@return 返回值，0-成功，其他-失败
**/
int CSetOutputMute(int session, bool enable);
/**
GetOutputMute() 获取输出静音状态
@param session 会话id
@return 返回值，false-不静音，true-静音
**/
bool CGetOutputMute(int session) ;
/**
SetInputMute() 设置输入静音
@param session  会话id
@param enable   false-不静音，true-静音
@return 返回值，0-成功，其他-失败
**/
int CSetInputMute(int session, bool enable);
/**
GetInputMute() 获取输入的静音状态
@param session 会话id
@return 返回值，false-不静音，true-静音
**/
bool CGetInputMute(int session);
/**
SetEcStatus() 回声消除开关
@param enable为True表示打开，为False表示关闭
@param ec_mode AEC模式
@return 返回值，0表示成功，非0表示失败
**/

int CSetEcStatus(bool enable,int ec_mode);
/**
SetLogPrintstatus() 日志系统的stdout输出开关
@param enable为True表示打开输出，为False表示关闭输出
**/
void CSetLogPrintstatus(bool enable);

/**
SetAgcStatus() 增益控制开关
@param enable为True表示打开，为False表示关闭
@param agc_mode 增益控制模式
@return 返回值，0表示成功，非0表示失败
**/

int CSetAgcStatus(bool enable, int agc_mode);
/**
SetNsStatus() 降噪开关
@param enable为True表示打开，为False表示关闭
@param ns_mode 降噪模式
@return 返回值，0表示成功，非0表示失败
**/

int CSetNsStatus(bool enable,int ns_mode);

/**
GetVersion() 获取SDK版本号
@return 返回值，版本号字符串
**/
char* CGetSDKVersion();

/**
Uploadfile() 上传文件到和家固话服务器，一般用于异常发生时上传log文件
@return 返回值，0表示成功，非0表示失败
**/
int CUploadfile();
/**
UploadLogToPBX() 上传文件到PBX服务器，一般用于异常发生时上传log文件
@param filepath, 文件的本地路径
@return 返回值，0表示成功，非0表示失败
**/

int CUploadLogToPBX(char* filepath);

/**
uploadFaultReport() 上报错误信息
@param desc, 错误描述

@return 返回值，0表示成功，非0表示失败
**/
int CuploadFaultReport(char* desc);

/**
PhoneNumber2Name() 获取通信录里输入手机号的名字
@param phoneNumber, 电话号码
@param phoneName, 用于返回名字
@return 返回值，0表示成功，非0表示失败
**/
int CPhoneNumber2Name(char* phoneNumber, 
						char* phoneName);

/**
CSendVideoOut() 发送视频数据
@param session, 会话id
@param data, 视频raw data buffer地址
@param length, 视频raw data buffer长度
@return 返回值，0表示成功，非0表示失败
**/
int CSendVideoOut(int session, char* data, int length);

void CSetConnectType(int connetcType);

int CSetOsAndDeviceModel(char* deviceModel, char* OSType);

void CSetLogPathAndSize(char *logPath, int logSize);

#ifdef __cplusplus 
}
#endif	
